package com.example.springbooteasyexcel.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.springbooteasyexcel.bean.MenuExcel;
import com.example.springbooteasyexcel.listener.DemoExcelListener;
import com.example.springbooteasyexcel.service.DemoExcelService;
import com.example.springbooteasyexcel.util.GeneralUtils;
import com.sun.deploy.net.URLEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@Controller
public class ExcelController {

    @Autowired
    private DemoExcelService excelService;

    @ResponseBody
    @RequestMapping("exportExcel")
    private String exportExcel(@RequestBody String jsonParam){
        String fileName = "/data/exportExcel" + System.currentTimeMillis() + ".xlsx";
        //去生成一个list数据
        List<MenuExcel> list = GeneralUtils.genList();
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, MenuExcel.class).sheet("模板").doWrite(list);
        return "exportExcel";
    }

    @ResponseBody
    @RequestMapping("exportMoreSheet")
    private String exportMoreSheet(@RequestBody String jsonParam){
        JSONObject param = JSONObject.parseObject(jsonParam);
        JSONArray userIds = param.getJSONArray("userIds");
        String fileName =  "/data/simpleWrite" + System.currentTimeMillis()+ ".xlsx";
        ExcelWriter excelWriter = null;
        try {
            // 这里 指定文件
            excelWriter = EasyExcel.write(fileName).build();
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i=0;i< userIds.size();i++){
                String userId = userIds.getString(i);
                List<MenuExcel> list = GeneralUtils.genList();
                System.out.println(list.size());
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变，我这里为了方便 所以用的同一个class 实际上可以一直变
                WriteSheet writeSheet = EasyExcel.writerSheet(i, userId).head(MenuExcel.class).build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                excelWriter.write(list, writeSheet);
            }
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
        return "exportMoreSheet";
    }

    @GetMapping("menu")
    public String getBookList(ModelMap map) {
        //去生成一个list数据
        List<MenuExcel> list = GeneralUtils.genList();
        //List<Book> list = new ArrayList<>();
        map.addAttribute("menuList", list);
        map.addAttribute("menuId", "menuId=666888");
        System.out.println("getBookList跳到页面上");
        return "menuList";
    }

    @ResponseBody
    @RequestMapping("exportByWeb")
    public String exportByWeb(String menuId) {
        System.out.println("666666666666688888:"+menuId);
        //去生成一个list数据
        List<MenuExcel> list = GeneralUtils.genList();
        System.out.println("exportByWeb跳到页面上");
        return "menuList22222222222222";
    }

    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link MenuExcel}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), MenuExcel.class).sheet("模板").doWrite(dataList());
    }

    private List<MenuExcel> dataList(){
        return GeneralUtils.genList();
    }

    /**
     * 文件上传
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), MenuExcel.class, new DemoExcelListener(excelService)).sheet().doRead();
        return "success";
    }
}
